উদাহরণ সহ Lazy এবং Eager Loading

Java Technologies - স্প্রিং বুট ওআরএম (Spring Boot ORM) - Lazy এবং Eager Loading
162

Lazy এবং Eager Loading কি?

Spring Boot ORM, বিশেষ করে Hibernate-এ Lazy Loading এবং Eager Loading হলো ডেটাবেজ থেকে ডেটা ফেচ করার দুটি কৌশল।

Lazy Loading

  • Lazy Loading হলো তখনই ডেটা লোড করা, যখন সেটি ব্যবহার করা হয়। এটি ডেটা লোড করার সময় কমায় এবং মেমরি ব্যবহার অপ্টিমাইজ করে।
  • Hibernate-এ FetchType.LAZY ডিফল্ট ফেচ টাইপ।

Eager Loading

  • Eager Loading হলো প্রথমবারেই সম্পর্কিত সমস্ত ডেটা লোড করা। এটি ডেটা অ্যাক্সেস দ্রুত করতে পারে তবে অপ্রয়োজনীয় ডেটা লোড হওয়ার ঝুঁকি থাকে।
  • Hibernate-এ FetchType.EAGER ব্যবহার করলে সম্পর্কিত সমস্ত ডেটা ইমিডিয়েটলি লোড হয়।

@OneToMany এবং @ManyToOne এর মাধ্যমে উদাহরণ

টেবিল সম্পর্কের সেটআপ

আমরা দুটি Entity ক্লাস নেব: Category এবং Product। একটি Category-এর অধীনে একাধিক Product থাকতে পারে।

Entity গুলো তৈরি

Category Entity:

import jakarta.persistence.*;
import java.util.List;

@Entity
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY) // Lazy Loading
    private List<Product> products;

    // Getters and Setters
}

Product Entity:

import jakarta.persistence.*;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double price;

    @ManyToOne(fetch = FetchType.EAGER) // Eager Loading
    @JoinColumn(name = "category_id")
    private Category category;

    // Getters and Setters
}

Lazy Loading এর উদাহরণ

Lazy Loading এর সময় সম্পর্কিত ডেটা তখনই লোড হবে, যখন তা প্রথমবার অ্যাক্সেস করা হবে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryService {
    @Autowired
    private CategoryRepository categoryRepository;

    public void showCategoryWithProducts(Long categoryId) {
        Category category = categoryRepository.findById(categoryId).orElse(null);

        if (category != null) {
            System.out.println("Category Name: " + category.getName());

            // Lazy Loading: Products তখনই লোড হবে, যখন এটি অ্যাক্সেস করা হবে
            List<Product> products = category.getProducts();
            products.forEach(product -> System.out.println("Product Name: " + product.getName()));
        }
    }
}

সমস্যা:

Lazy Loading ব্যবহার করার সময় Session বন্ধ হয়ে গেলে LazyInitializationException হতে পারে।


Eager Loading এর উদাহরণ

Eager Loading এর সময় সম্পর্কিত সমস্ত ডেটা সরাসরি প্রথমবারেই লোড হয়।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public void showProductWithCategory(Long productId) {
        Product product = productRepository.findById(productId).orElse(null);

        if (product != null) {
            System.out.println("Product Name: " + product.getName());
            System.out.println("Category Name: " + product.getCategory().getName());
            // Category ইতিমধ্যেই Eagerly লোড করা হয়েছে
        }
    }
}

সুবিধা:

Eager Loading ব্যবহার করলে LazyInitializationException এর ঝুঁকি নেই, কারণ সম্পর্কিত ডেটা লোড হওয়া নিশ্চিত।


Lazy এবং Eager Loading এর তুলনা

বৈশিষ্ট্যLazy LoadingEager Loading
ডেটা লোড টাইমিংপ্রয়োজন অনুযায়ী লোড হয়।প্রথমবারেই সব সম্পর্কিত ডেটা লোড হয়।
পারফরম্যান্সকম ডেটা লোড হওয়ায় দ্রুত।বেশি ডেটা লোড হলে পারফরম্যান্স স্লো হতে পারে।
মেমরি ব্যবহারকম মেমরি ব্যবহার করে।বেশি মেমরি ব্যবহার করে।
LazyInitializationExceptionসম্ভাবনা থাকে।থাকে না।

সঠিক কৌশল নির্বাচন

  • Lazy Loading: বড় ডেটাসেটের ক্ষেত্রে যেখানে সমস্ত ডেটা প্রয়োজন হয় না।
  • Eager Loading: ছোট ডেটাসেটের ক্ষেত্রে বা যখন সমস্ত সম্পর্কিত ডেটা অবিলম্বে প্রয়োজন হয়।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...